home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / tclMotif-1.4 / send / programs / xmSend5.c < prev    next >
C/C++ Source or Header  |  1995-06-29  |  6KB  |  223 lines

  1. /*
  2.  * A Motif program to send and receive messages internally, to its own
  3.  * buttons. This one has two local interpreters, and three registered names
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <Xm/Label.h>
  8. #include <Xm/PushB.h>
  9. #include <Xm/RowColumn.h>
  10. #include "../tclXtSend.h"
  11.  
  12. void
  13. SendTo1(w, clientData, callData)
  14.     Widget w;
  15.     XtPointer clientData;
  16.     XtPointer callData;
  17. {
  18.     Tcl_Interp *interp = (Tcl_Interp *) clientData;
  19.     char sendCommand[1024];
  20.  
  21.     strcpy(sendCommand,
  22.         "send xmSend5.1 incrementLabel1");
  23.     if (Tcl_Eval(interp, sendCommand) != TCL_OK)
  24.     fprintf(stderr, "send failed: %s\n", interp->result);
  25. }
  26.  
  27. void
  28. SendTo2(w, clientData, callData)
  29.     Widget w;
  30.     XtPointer clientData;
  31.     XtPointer callData;
  32. {
  33.     Tcl_Interp *interp = (Tcl_Interp *) clientData;
  34.     char sendCommand[1024];
  35.  
  36.     strcpy(sendCommand,
  37.         "send xmSend5.1 incrementLabel1");
  38.     if (Tcl_Eval(interp, sendCommand) != TCL_OK)
  39.     fprintf(stderr, "send failed: %s\n", interp->result);
  40.  
  41.     strcpy(sendCommand,
  42.         "send xmSend5.2 incrementLabel2");
  43.     if (Tcl_Eval(interp, sendCommand) != TCL_OK)
  44.     fprintf(stderr, "send failed: %s\n", interp->result);
  45. }
  46.  
  47. void
  48. SendTo3(w, clientData, callData)
  49.     Widget w;
  50.     XtPointer clientData;
  51.     XtPointer callData;
  52. {
  53.     Tcl_Interp *interp = (Tcl_Interp *) clientData;
  54.     char sendCommand[1024];
  55.  
  56.     strcpy(sendCommand,
  57.         "send xmSend5.1 incrementLabel1\n\
  58.          send xmSend5.2 incrementLabel2\n\
  59.          send xmSend5.3 incrementLabel3");
  60.     if (Tcl_Eval(interp, sendCommand) != TCL_OK)
  61.     fprintf(stderr, "send failed: %s\n", interp->result);
  62. }
  63.  
  64.  
  65. char incrementLabelCmd[] = "\
  66.   proc incrementLabel1 {} { \n\
  67.     getLabel1 value \n\
  68.     incr value \n\
  69.     setLabel1 $value \n\
  70.   } \n\
  71.   proc incrementLabel2 {} { \n\
  72.     getLabel2 value \n\
  73.     incr value \n\
  74.     setLabel2 $value \n\
  75.   } \n\
  76.   proc incrementLabel3 {} { \n\
  77.     getLabel3 value \n\
  78.     incr value \n\
  79.     setLabel3 $value \n\
  80.   } \
  81. ";
  82.  
  83. int
  84. SetLabel(clientData, interp, argc, argv)
  85.     ClientData *clientData;
  86.     Tcl_Interp *interp;
  87.     int argc;
  88.     char **argv;
  89. {
  90.     XmString xmstr;
  91.     Widget w = (Widget) clientData;
  92.  
  93.     if (argc < 2) {
  94.     Tcl_SetResult(interp, "setLabel label", TCL_STATIC);
  95.     return TCL_ERROR;
  96.     }
  97.  
  98. fprintf(stderr, "**Setting label to %s\n", argv[1]);
  99.     xmstr = XmStringCreateLocalized(argv[1]);
  100.     XtVaSetValues(w, XmNlabelString, xmstr, NULL);
  101.     XmStringFree(xmstr);
  102.  
  103.     return TCL_OK;
  104. }
  105.  
  106. int
  107. GetLabel(clientData, interp, argc, argv)
  108.     ClientData *clientData;
  109.     Tcl_Interp *interp;
  110.     int argc;
  111.     char **argv;
  112. {
  113.     XmString xmstr;
  114.     String str;
  115.     Widget w = (Widget) clientData;
  116.  
  117.     if (argc < 2) {
  118.     Tcl_SetResult(interp, "getLabel \"label\"", TCL_STATIC);
  119.     return TCL_ERROR;
  120.     }
  121.  
  122.     XtVaGetValues(w, XmNlabelString, &xmstr, NULL);
  123.     XmStringGetLtoR(xmstr, XmFONTLIST_DEFAULT_TAG, &str);
  124.     Tcl_SetVar(interp, argv[1], str, 0);
  125.  
  126.     XtFree(str);
  127.     XmStringFree(xmstr);
  128.  
  129.     return TCL_OK;
  130. }
  131.  
  132. int
  133. main(argc, argv)
  134.     int argc;
  135.     char **argv;
  136. {
  137.     Widget toplevel;
  138.     Widget rc;
  139.     Widget button;
  140.     Widget label;
  141.     Tcl_Interp *interp1, *interp2, *interp3;
  142.     XtAppContext app;
  143.  
  144.     toplevel = XtAppInitialize(&app, "XmSend", NULL, 0, &argc, argv,
  145.                 NULL, NULL, 0);
  146.  
  147.     interp1 = Tcl_CreateInterp();
  148.     interp2 = Tcl_CreateInterp();
  149.     interp3 = Tcl_CreateInterp();
  150.  
  151.     if (TclXtSend_RegisterInterp(interp1, "xmSend5.1", toplevel) == TCL_ERROR) {
  152.     fprintf(stderr, "couldn't register interpreter 5.1\n");
  153.     exit(1);
  154.     }
  155.  
  156.     if (TclXtSend_RegisterInterp(interp2, "xmSend5.2", toplevel) == TCL_ERROR) {
  157.     fprintf(stderr, "couldn't register interpreter 5.2\n");
  158.     exit(1);
  159.     }
  160.  
  161.     if (TclXtSend_RegisterInterp(interp3, "xmSend5.3", toplevel) == TCL_ERROR) {
  162.     fprintf(stderr, "couldn't register interpreter 5.3\n");
  163.     exit(1);
  164.     }
  165.  
  166.     rc = XmCreateRowColumn(toplevel, "rc", NULL, 0);
  167.     XtManageChild(rc);
  168.     XtVaSetValues(rc,
  169.         XmNpacking, XmPACK_COLUMN,
  170.         XmNnumColumns, 2,
  171.         NULL);
  172.  
  173.     button = XmCreatePushButton(rc, "Incr label1", NULL, 0);
  174.     XtManageChild(button);
  175.     XtAddCallback(button, XmNactivateCallback, SendTo1, (XtPointer) interp1);
  176.  
  177.     button = XmCreatePushButton(rc, "Incr 1&2", NULL, 0);
  178.     XtManageChild(button);
  179.     XtAddCallback(button, XmNactivateCallback, SendTo2, (XtPointer) interp2);
  180.  
  181.     button = XmCreatePushButton(rc, "Incr 1&2&3", NULL, 0);
  182.     XtManageChild(button);
  183.     XtAddCallback(button, XmNactivateCallback, SendTo3, (XtPointer) interp3);
  184.  
  185.     label = XmCreateLabel(rc, "1", NULL, 0);
  186.     XtManageChild(label);
  187.     Tcl_CreateCommand(interp1, "setLabel1", SetLabel, (ClientData *) label,
  188.         (Tcl_CmdDeleteProc *) NULL);
  189.     Tcl_CreateCommand(interp1, "getLabel1", GetLabel, (ClientData *) label,
  190.         (Tcl_CmdDeleteProc *) NULL);
  191.  
  192.     label = XmCreateLabel(rc, "2", NULL, 0);
  193.     XtManageChild(label);
  194.     Tcl_CreateCommand(interp2, "setLabel2", SetLabel, (ClientData *) label,
  195.         (Tcl_CmdDeleteProc *) NULL);
  196.     Tcl_CreateCommand(interp2, "getLabel2", GetLabel, (ClientData *) label,
  197.         (Tcl_CmdDeleteProc *) NULL);
  198.  
  199.     label = XmCreateLabel(rc, "3", NULL, 0);
  200.     XtManageChild(label);
  201.     Tcl_CreateCommand(interp3, "setLabel3", SetLabel, (ClientData *) label,
  202.         (Tcl_CmdDeleteProc *) NULL);
  203.     Tcl_CreateCommand(interp3, "getLabel3", GetLabel, (ClientData *) label,
  204.         (Tcl_CmdDeleteProc *) NULL);
  205.  
  206.     XtRealizeWidget(toplevel);
  207.  
  208.     /*
  209.      * Create tcl commands based in C, and then load a procedure
  210.      */
  211.     if (Tcl_Eval(interp1, incrementLabelCmd) != TCL_OK)
  212.     fprintf(stderr, "couldn't load cmds: %s\n", interp1->result);
  213.  
  214.     if (Tcl_Eval(interp2, incrementLabelCmd) != TCL_OK)
  215.     fprintf(stderr, "couldn't load cmds: %s\n", interp2->result);
  216.  
  217.     if (Tcl_Eval(interp3, incrementLabelCmd) != TCL_OK)
  218.     fprintf(stderr, "couldn't load cmds: %s\n", interp3->result);
  219.  
  220.  
  221.     XtAppMainLoop(app);
  222. }
  223.